import axios from 'axios'
import { getTokenKey, getToken, removeToken } from './token'
import { Message } from 'element-ui'
import router from '../router'

const tokenKey = getTokenKey()

const request = axios.create({
  timeout: 120 * 1000,
  // withCredentials: true,
  headers: {
    'Content-Type': 'application/json; charset=utf-8'
  }
})

/**
 * 封装的异常对象
 * @param message
 * @param code
 * @constructor
 */
function EipException(message, code) {
  this.msg = message
  this.code = code
}

// axios请求拦截器
request.interceptors.request.use((config) => {
  // 携带token
  config.headers[tokenKey] = getToken()
  return config
}, function(error) {
  // axios请求失败时进行拦截，并进行相应操作
  return Promise.reject(error)
})

// axios响应拦截器
request.interceptors.response.use((response) => {
  const res = response.data
  // 异常拦截
  if (res && res.code === 401) {
    // 清除token，重新登录
    removeToken()
    router.push('/login')
  } else if (res && res.code !== 200) {
    // 错误信息统一在这里处理、页面代码只需要关系正常情况即可
    Message({
      message: response.data.msg || 'error',
      type: 'error',
      duration: 5 * 1000
    })
    throw new EipException(response.data.msg, response.data.code)
  } else {
    return res
  }
}, (error) => {
  // http状态码不为2xx时，执行该函数
  // 响应失败时进行拦截，并进行相应操作
  if (error.message && error.message === 'Network Error') {
    Message({
      message: `服务无法访问，请确定当前终端是否能够访问: ${window.SITE_CONFIG.baseUrl}`,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  } else {
    Message({
      message: '接口无法访问',
      type: 'error',
      duration: 5 * 1000
    })
  }
  return Promise.reject(error)
})

export default request
